#include <brpc/server.h>
#include <butil/logging.h>
#include "main.pb.h"

// 1. 继承于EchoService创建一个子类，并实现rpc调用的业务功能
class EchoServiceImpl : public example::EchoService {
    public:
        EchoServiceImpl(){}
        ~EchoServiceImpl(){}

        // 实现Echo方法，处理客户端请求
        void Echo(google::protobuf::RpcController* controller,
                  const ::example::EchoRequest* request,
                  ::example::EchoResponse* response,
                  ::google::protobuf::Closure* done) {
            // brpc::ClosureGuard 用来确保响应结束后执行 done->Run()
            brpc::ClosureGuard rpc_guard(done);

            // 输出收到的请求消息
            std::cout << "收到消息:" << request->message() << std::endl;

            // 处理响应：将请求消息加上后缀作为响应
            std::string str = request->message() + "--这是响应！！";
            response->set_message(str);  // 设置响应消息

            // 注意：done->Run() 被 brpc::ClosureGuard 自动调用，所以不需要手动调用
        }
};

int main(int argc, char *argv[])
{
    // 2. 关闭brpc的默认日志输出
    logging::LoggingSettings settings;
    settings.logging_dest = logging::LoggingDestination::LOG_TO_NONE;  // 禁止日志输出
    logging::InitLogging(settings);  // 初始化日志配置

    // 3. 构造服务器对象
    brpc::Server server;  // 创建 brpc 服务器对象

    // 4. 向服务器对象中，新增EchoService服务
    EchoServiceImpl echo_service;  // 创建服务实现对象
    int ret = server.AddService(&echo_service, brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE);
    // 将服务对象添加到服务器中，告诉 brpc 服务器不负责服务对象的生命周期
    if (ret == -1) {
        std::cout << "添加Rpc服务失败！\n";
        return -1;  // 如果添加服务失败，返回错误
    }

    // 5. 启动服务器
    brpc::ServerOptions options;  
    options.idle_timeout_sec = -1;  // 设置连接空闲超时时间为-1，表示永不超时
    options.num_threads = 1;  // 设置1个 IO 线程来处理请求
    ret = server.Start(8080, &options);  // 启动服务器，监听8080端口
    if (ret == -1) {
        std::cout << "启动服务器失败！\n";
        return -1;  // 如果启动失败，返回错误
    }

    // 6. 进入主循环，等待客户端请求
    server.RunUntilAskedToQuit();  // 服务器运行，直到接收到退出请求

    return 0;  // 服务器正常退出
}
